<?php
require_once 'vendor/autoload.php';

require_once 'PHPMailer/PHPMailerAutoload.php';

/**
 * 消息推送驱动器组件：Eml.PHPMailer[消息子模型-EML.PHPMailer!]
 * 
 * @date	2017年7月20日 下午12:52:22
 * 
 */
class MessagePusherEml_PHPMailer extends CI_Driver implements libraries\common\MessagePusherInterface
{
	const DEBUG_MODE = false;
	private $mailHost = 'smtp.qq.com'; //链接qq域名邮箱的服务器地址
	private $mailSMTPSecure = 'ssl'; //设置使用ssl加密方式登录鉴权
	private $mailPort = 465; //设置ssl连接smtp服务器的远程服务器端口号，以前的默认是25，但是现在新的好像已经不可用了 可选465或587
	private $mailHelo = 'Hello smtp.qq.com Server'; //设置smtp的helo消息头 这个可有可无 内容任意
	private $mailHostname = 'http://your.host.domain'; //设置发件人的主机域 可有可无 默认为localhost 内容任意，建议使用你的域名
	private $mailCharSet = 'UTF-8'; //设置发送的邮件的编码 可选GB2312 我喜欢utf-8 据说utf8在某些客户端收信下会乱码
	private $mailFromName = '<YourDisplayName>'; //设置发件人姓名（昵称） 任意内容，显示在收件人邮件的发件人邮箱地址前的发件人姓名
	private $mailUsername = '<YourMailAccount>@qq.com'; //smtp登录的账号 这里填入字符串格式的qq号即可
	private $mailPassword = '<YourSecurePwd>'; //smtp登录的密码 使用生成的授权码（就刚才叫你保存的最新的授权码）
	private $mailFrom = '<YourMailAccount>@qq.com'; //设置发件人邮箱地址 这里填入上述提到的“发件人邮箱”
	private $mailIsHTML = true; //邮件正文是否为html编码 注意此处是一个方法 不再是属性 true或false
	
	private $lastResponse       = null;
	
	public function __set($var, $val)
	{
		$this->$var = $val;
	}
	
	public function __construct($config = array())
	{
		
	}
	
	/**
	 * 给定数据执行推送
	 *
	 * @param array $data
	 *
	 * @return void
	 */
	public function pushPerform($data)
	{
		if(self::DEBUG_MODE) {
			return ;
		}
		$toEmail = $data['email'];
		$subject = $data['subject'];
		$message = $data['msg'];
		$this->lastResponse = $this->send($toEmail, $subject, $message);
	}
	
	/**
	 * 获取上一次推送的状态
	 *
	 * @return boolean
	 */
	public function getStatus()
	{
		if(self::DEBUG_MODE) {
			return true;
		}
		$response = $this->getParsedResponse();
		if($response == true) {
			return true;
		}
		
		return false;
	}
	
	public function getMessage()
	{
		$response = $this->getParsedResponse();
		if($response) {
			return 'success';
		}
		
		return false;
	}
	
	/** 发送邮件方法
	 * @param $to：接收者 $title：标题 $content：邮件内容
	 * @return bool true:发送成功 false:发送失败
	 */
	private function send($toMail, $subject, $message, $toMailNick = '在线通知')
	{
		//实例化PHPMailer核心类
		$mail = new PHPMailer();
		
		//是否启用smtp的debug进行调试 开发环境建议开启 生产环境注释掉即可 默认关闭debug调试模式
		//$mail->SMTPDebug = self::DEBUG_MODE; // 不能使用 self::DEBUG_MODE，否则根本执行不到这儿！
		$mail->SMTPDebug = false; // 不能使用 self::DEBUG_MODE，否则根本执行不到这儿！
		// MARK PHPMailer.SMTPDebug = false: authenticate' => string(35) "SMTP Error: Could not authenticate."
		// MARK PHPMailer.SMTPDebug = true : 535 Error: ��ʹ����Ȩ���¼�������뿴: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
		// http://blog.csdn.net/baidu_30000217/article/details/51550259
		
		//使用smtp鉴权方式发送邮件
		$mail->isSMTP();
		
		//smtp需要鉴权 这个必须是true
		$mail->SMTPAuth = true;
		
		//链接qq域名邮箱的服务器地址
		$mail->Host = $this->mailHost;
		
		//设置使用ssl加密方式登录鉴权
		$mail->SMTPSecure = $this->mailSMTPSecure;
		
		//设置ssl连接smtp服务器的远程服务器端口号，以前的默认是25，但是现在新的好像已经不可用了 可选465或587
		$mail->Port = $this->mailPort;
		
		//设置smtp的helo消息头 这个可有可无 内容任意
		// $mail->Helo = $this->mailHelo;
		
		//设置发件人的主机域 可有可无 默认为localhost 内容任意，建议使用你的域名
		$mail->Hostname = $this->mailHostname;
		
		//设置发送的邮件的编码 可选GB2312 我喜欢utf-8 据说utf8在某些客户端收信下会乱码
		$mail->CharSet = $this->mailCharSet;
		
		//设置发件人姓名（昵称） 任意内容，显示在收件人邮件的发件人邮箱地址前的发件人姓名
		$mail->FromName = $this->mailFromName;
		
		//smtp登录的账号 这里填入字符串格式的qq号即可
		$mail->Username = $this->mailUsername;
		
		//smtp登录的密码 使用生成的授权码（就刚才叫你保存的最新的授权码）
		$mail->Password = $this->mailPassword;
		
		//设置发件人邮箱地址 这里填入上述提到的“发件人邮箱”
		$mail->From = $this->mailFrom;
		
		//邮件正文是否为html编码 注意此处是一个方法 不再是属性 true或false
		$mail->isHTML($this->mailIsHTML);
		
		// 这里 PHPMailer 不支持 CSV 形式, 需要变成数组多次添加！
		$toMails = is_string($toMail) ? explode(',', $toMail) : $toMail;
		foreach ($toMails as $toMail)
		//设置收件人邮箱地址 该方法有两个参数 第一个参数为收件人邮箱地址 第二参数为给该地址设置的昵称 不同的邮箱系统会自动进行处理变动 这里第二个参数的意义不大
		$mail->addAddress($toMail, $toMailNick);
		
		//添加多个收件人 则多次调用方法即可
		// $mail->addAddress('xxx@163.com','lsgo在线通知');
		
		//添加该邮件的主题
		$mail->Subject = $subject;
		
		//添加邮件正文 上方将isHTML设置成了true，则可以是完整的html字符串 如：使用file_get_contents函数读取本地的html文件
		$mail->Body = $message;
		
		//为该邮件添加附件 该方法也有两个参数 第一个参数为附件存放的目录（相对目录、或绝对目录均可） 第二参数为在邮件附件中该附件的名称
		// $mail->addAttachment('./d.jpg', 'mm.jpg');
		//同样该方法可以多次调用 上传多个附件
		// $mail->addAttachment('./Jlib-1.1.0.js', 'Jlib.js');
		
		$status = $mail->send();
		
		//简单的判断与提示信息
		if($status) {
			return true;
		}else{
			return false;
		}
	}
	
	private function getParsedResponse()
	{
		if(!isset($this->lastResponse)) {
			trigger_error(sprintf("%s::%s: You Shouldn't call me here, because no response now!", __CLASS__, __METHOD__), E_USER_ERROR);
			return false;
		}
		
		$response = $this->lastResponse;
		
		//print_r($response);
		return $response;
	}
	
}

